import Taro from '@tarojs/taro';
import { getChatList } from './api';
import { sokectUrl } from './base_url';
class SokectEvent {
    constructor(){
        this.uid = Taro.getStorageSync('userToken') || null;
        this.sokectUrl = sokectUrl;
        this.list = []; //聊天列表数据
        this.sokectStatus = false; //sokect链接状态
    }
    init(){
        return false
        var _this = this;
        this.uid = Taro.getStorageSync('userToken') || null;
        if (_this.uid) {
            _this.task ? _this.closeESokect() : "";
            Taro.connectSocket({
                url: this.sokectUrl,
                success() { }
              }).then(task => {
                _this.task = task;
                task.onOpen(() => { _this.setSokectStatus(true); _this.bindUser() ;  _this.reqChatList()  })
                task.onError(() => { _this.setSokectStatus(false);});
                task.onClose((e) => { _this.setSokectStatus(false);setTimeout(() => {_this.init()},3000)});
                task.onMessage(res => {
                  _this.setSokectStatus(true) ; 
                  if (JSON.parse(res.data).event != 'pong'){
                    _this.emitEvent('gotMsg',JSON.parse(res.data));
                    _this.list.map(v => {
                      v.user_id == JSON.parse(res.data).from_user_id ? v.is_read = 0 : "";
                      return v
                    })
                    _this.reqChatList();
                  }
                })
            })
        }else{
           console.log('没有检测到登陆，跳过初始化sokect')
        }
    }
    reqChatList(){  //请求聊天列表
      this.list.length == 0
      //getChatList().then(res => { if(res.code == 1) this.list = res.data.data; this.emitEvent('gotListStatus');});
    }
    bindUser(){
      let _sayContent = '{"event":"bind","user_id":' + this.uid + '}';
      this.task.send({data:_sayContent});
      this.heartbeat = setInterval(() => { this.task.send({data:'{"event":"ping"}'})},25000); //心跳检测
    }
    /**
     * @desc 发送sokect信息
     * @param1 目标id
     * @param2 发送内容
     * @param3 发送类型1是文本 4是订单
    */
    sendMsg(toId,content,msg_type = 1){
      var _this = this;
      var _sayContent = '{"event":"send","from_user_id":"'+this.uid+'","to_user_id":"'+toId+'","msg_type":"'+msg_type+'","content":"'+content +'"}\n';
      _this.task.send({data:_sayContent,success(){
        _this.reqChatList();
      }});
    }
    getList(){ return this.list} // 本地读取聊天列表 暴露外部使用
    closeESokect(){var _this = this; this.task.close({success(){ _this.setSokectStatus(false) ; clearInterval(_this.heartbeat) }})}  //关闭sokect链接
    getSokectStatus(){return this.sokectStatus} // 读取sokect状态
    setSokectStatus(status){this.sokectStatus = status;this.emitEvent('gotStatus',status)} //设置sokect状态
    emitEvent(eventName,params){ if(this[eventName])this[eventName](params); } //事件触发流方法
    /**
     * @desc    事件订阅流方法 ：如果有新消息此方法会被通知 ，以下所有事件名称 ：
     * @methods gotMsg 订阅信息里流 @param1 信息名称
     * @methods gotStatus 订阅sokect状态 @param1 sokect 状态
     * @methods gotListStatus 订阅消息已读状态未读状态 
     **/
    onEvent(eventName,callback){ this[eventName] = callback; }
    readToMsg(user_id){
        this.list = this.list.map(v => {
          v.user_id == user_id ? v.is_read = 1 :"";
          return v
        })
        this.emitEvent('gotListStatus');
    }   //读取指定信息
}
const eSokect  = new SokectEvent;
export default eSokect;